﻿function CheckField(field, type, error) {
    this.field = field;
    this.type = type;// 1 kieu string. 2 kieu float, 3 kieu email
    this.error = error;
}

function Constants() {

}
Constants.rows = 20;
Constants.Url = "http://" + window.location.host.replace("http://", "") + "/";
Constants.service = Constants.Url + "Models-WebDomainService.svc/JSON/";
Constants.messDelete = "Bạn có muốn xóa dòng này không?";
Constants.selectEdit = "Bạn chưa chọn dòng để sửa. Xin vui lòng chọn dòng cần sửa.";
Constants.selectDelete = "Bạn chưa chọn dòng để xóa. Xin vui lòng chọn dòng cần xóa.";
Constants.errString = "Không được bỏ trống ô này";
Constants.errInt = "Giá trị nhập vào phải là 1 kiểu số nguyên";
Constants.errFloat = "Xin vui lòng nhập vào 1 kiểu số thực";
Constants.find = "Không tìm thấy";
//ham kiem tra mot email co hop le khong
Constants.IsEmail = function (email) {
    var emailPattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/;
    return emailPattern.test(email);
}

Constants.Cancel = function () {
    $("#dialog").empty();
    $("#dialog").dialog("close");
}
///ham kiem tra 1 so co phai la so nguyen
Constants.isInt = function (n) {
    return n != "" && !isNaN(n) && Math.round(n) == n;
}

//ham kiem tra 1 so co phai la so thuc
Constants.isFloat = function (n) {
    return n != "" && !isNaN(n) && Math.round(n) != n;
}

Constants.Onfocus = function (in_objs) {
    for (var i = 0; i < in_objs.length; i++) {
        var my = in_objs[i];
        $("#" + my).focus(function () {
            $(this).addClass("focustag");
        })
        .blur(function () {
            $(this).removeClass("focustag");
        });
    }
}

Constants.Required = function (in_objs) {
    for (var i = 0; i < in_objs.length; i++) {
        var obj = in_objs[i];
        var error = obj.error;
        Constants.showElement(error);
        $("#" + error).html("(*)");
    }
}

Constants.Enters = function (in_objs) {
    for (var i = 0; i < in_objs.length - 1; i++) {
        var my = in_objs[i];
        var my2 = in_objs[i + 1];
        $("#" + my).keypress(function (event) {
            if (event.keyCode == 13) {
                $("#"+ my2).focus();
                event.preventDefault();
            }
        });
    }
}

Constants.OnSubmit = function (in_objs) {
    var isBool = true;
    var flag = false;
    for (var i = 0; i < in_objs.length; i++) {
        var obj = in_objs[i];
        var value = $("#" + obj.field).val();
        var type = obj.type;
        var error = obj.error;
        switch (type) {
            case 1: //String
                {
                    if (value == "" || value == undefined || value == null) {
                        Constants.showElement(error);
                        $("#" + error).html(Constants.errString);
                        isBool = false;
                        if (flag == false) {
                            flag = true;
                            $("#" + obj.field).focus();
                        }
                    }
                    break;
                }
            case 2: //kiem tra kieu so thuc 
                {
                    if (Constants.isFloat(value) == false && Constants.isInt(value) == false) {
                        Constants.showElement(error);
                        $("#" + error).html(Constants.errFloat);
                        isBool = false;
                        if (flag == false) {
                            flag = true;
                            $("#" + obj.field).focus();
                        }
                    }
                    break;
                }
            case 3: //kiem tra email co hop le hay khong
                {
                    if (Constants.IsEmail(value) == false) {
                        isBool = false;
                        $("#" + error).html("Email không hợp lệ");
                    }
                    break;
                }
            case 0: //kieu so
                {
                    if (Constants.isInt(value) == false) {
                        Constants.showElement(error);
                        $("#" + error).html(Constants.errInt);
                        isBool = false;
                        if (flag == false) {
                            flag = true;
                            $("#" + obj.field).focus();
                        }
                    }
                    break;
            }
        }
    }
    return isBool;
}

Constants.parseDate = function (strDate, character) {
    var mdy = strDate.split(character);
    var mm = parseInt(String(mdy[1]), 10) - 1;
    var dd = parseInt(String(mdy[0]), 10); //them tham so 10 de khi convert tu chuoi sang kieu int.Neu ko co tham so thu 2 (so 10)
    var yy = parseInt(String(mdy[2]), 10); // thi khi convert "09" ==> 0
    return new Date(yy, mm, dd);
}

Constants.getObjById = function (id) {
    if (document.getElementById)
        var returnVar = document.getElementById(id);
    else if (document.all)
        var returnVar = document.all[id];
    else if (document.layers)
        var returnVar = document.layers[id];
    return returnVar;
}

Constants.showElement = function (id) {
    var myVal = Constants.getObjById(id);
    if (myVal == null || myVal == undefined) {

    }
    else {
        myVal.style.opacity = 1; //Hien thi 1 tag
    }
}

Constants.hideElement = function (id) {
    var myVal = Constants.getObjById(id);
    if (myVal == null || myVal == undefined) {
    }
    else {
        myVal.style.opacity = 0;
    }
}

Constants.Save = function (key, objs) {
    localStorage.removeItem(key);
    localStorage.setItem(key, JSON.stringify(objs));
}

Constants.LoadBangGia = function () {
    var serviceUrl = Constants.service + "getAllTblBangGias";
    $.ajax({
        type: "Post",
        url: serviceUrl, // Location of the service
        //data: json, //Data sent to server
        contentType: "application/json", // content type sent to server
        dataType: "json", //Expected data format from server
        cache: false,
        success: function (msg) {
            var results = msg.getAllTblBangGiasResult;
            var arrs = new Array();
            for (var i = 0; i < results.length; i++) {
                var obj = {
                    Tu: results[i].Tu,
                    Den: results[i].Den,
                    DonGia: results[i].DonGia
                }
                arrs.push(obj);
            }
            if (arrs.length > 0) {
                Constants.Save("banggia", arrs);
            }            
        },
        error: function (err) {
            // When Service call fails
        }
    });
}

Constants.Read = function (name) {
    var objs = localStorage.getItem(name);
    if (objs == null || objs == undefined) {
        return null;
    }
    return JSON.parse(objs);
}

//them 1 class css vao tag
Constants.addClass = function (id, className) {
    var myVal = Constants.getObjById(id);
    if (myVal == null || myVal == undefined) {
    }
    else {
        myVal.className = className;
    }
}

Constants.removeClass = function (id) {
    var myVal = Constants.getObjById(id);
    if (myVal == null || myVal == undefined) {
    }
    else {
        myVal.className = '';
    }
}

Constants.clearAll = function (fieldsText) {
    var l = fieldsText.length;
    var focus = false;
    for (var i = 0; i < l; i++) {
        var myVal = Constants.getObjById(fieldsText[i]);
        if (focus == false && myVal != null) {
            myVal.focus();
            focus = true;
        }
        myVal.value = "";
    }
    return false;
}

Constants.hideFields = function (fieldsError, error) {
    if (fieldsError == undefined) {
        return false;
    }
    var l = fieldsError.length;
    var myErr = "";
    if (error != undefined && error != null) {
        myErr = error;
    }
    for (var i = 0; i < l; i++) {
        Constants.hideElement(String(myErr + fieldsError[i]));
    }
    return false;
}

Constants.isNumberKey = function(evt) {
    var charCode = (evt.which) ? evt.which : event.keyCode
    if (charCode > 31 && (charCode < 48 || charCode > 57))
        return false;
    return true;
}
/// String
/// function cat khoang trang 2 dau cua chuoi(dau chuoi va cuoi chuoi)
String.prototype.trim = function () {
    var strText = this;
    if (strText == null) {
        return "";
    }
    if (strText.length == undefined) {
        return "Skip this item";
    }
    while (strText.length != 0) {
        if (strText.substring(0, 1) == ' ') {
            strText = strText.substring(1, strText.length); //cat khoang trang ben trai chuoi
        }
        else break;
    }
    //cat khoang trang ben phai chuoi
    while (strText.length != 0) {
        if (strText.substring(strText.length - 1, strText.length) == ' ') {
            strText = strText.substring(0, strText.length - 1);
        }
        else break;
    }
    return strText;
}

String.prototype.replaceAll = function (strTarget, strSubString) {
    var strText = this;
    var indexString = strText.indexOf(strTarget);
    while (indexString != -1) {
        strText = strText.replace(strTarget, strSubString);
        indexString = strText.indexOf(strTarget);
    }
    return strText;
}

/// Array
Array.prototype.contains = function (value) {
    for (var k = 0; k < this.length; k++)
        if (value == this[k])
            return true;
    return false;
}

Array.prototype.searchIndex = function (value) {
    for (var k = 0; k < this.length; k++)
        if (value == this[k])
            return k;
    return -1;
}

Array.prototype.clone = function () {
    var result = new Array();
    for (var k = 0; k < this.length; k++) {
        result.push(this[k]);
    }
    return result;
}

Constants.formatDate = function(jsDate) {
    var seconds = jsDate.getSeconds() < 10 ? "0" + jsDate.getSeconds() : jsDate.getSeconds();
    var minutes = jsDate.getMinutes() < 10 ? "0" + jsDate.getMinutes() : jsDate.getMinutes();
    var hours = jsDate.getHours() < 10 ? "0" + jsDate.getHours() : jsDate.getHours();
    var day = jsDate.getDate() < 10 ? "0" + jsDate.getDate() : jsDate.getDate();
    var month = jsDate.getMonth() + 1;
    var strMonth = month < 10 ? "0" + month.toString() : month.toString();
    var year = jsDate.getFullYear();
    var strDate = day + "-" + strMonth + "-" + year;
    //strDate = strDate + " " + hours + ":" + minutes + ":" + seconds;
    return strDate;
}

function paging(_pages, number_page, flag) {
    $('#pagination').empty();
    if (_pages == 1)
        return;
    //flag = 0 an prev ,1 hien thi ca prev.next, 2 an next
    var bBool = false;
    var strSpan = "<span id=\"prev\" class=\"disabled\">&lt;&lt; Prev</span>";
    if (flag != 0) {
        strSpan = "<a id=\"prev\">&lt;&lt; Prev</a>";
    }
    var className = "class=\"current\"";
    if (_pages <= 10) {
        for (var i = 1; i <= _pages; i++) {
            if (i != number_page) {
                className = "";
                strSpan += "<a id=\"" + i + "\">" + i + "</a>";
            }
            else {
                className = "class=\"current\"";
                strSpan += "<span id=\"" + i + "\" " + className + ">" + i + "</span>";
            }
            bBool = true;
        }
    }
    else if (number_page < _pages - 2) {
        var temp = number_page <= 8 ? 1 : number_page - 7;
        var count = 1;
        while (count <= 8 && count < _pages) {
            if (temp != number_page) {
                className = "";
                strSpan += "<a id=\"" + temp + "\">" + temp + "</a>";
            }
            else {
                className = "class=\"current\"";
                strSpan += "<span id=\"" + temp + "\" " + className + ">" + temp + "</span>";
            }
            temp++;
            count++;
            bBool = true;
        }
        count = _pages - 1;
        strSpan += " ... ";
        while (count <= _pages) {
            if (count != number_page) {
                className = "";
                strSpan += "<a id=\"" + count + "\">" + count + "</a>";
            }
            else {
                className = "class=\"current\"";
                strSpan += "<span id=\"" + count + "\" " + className + ">" + count + "</span>";
            }
            count++;
            bBool = true;
        }
    }
    else if (number_page >= _pages - 2) {
        var temp = number_page - 9;
        strSpan += " ... ";
        while (temp <= _pages) {
            if (temp != number_page) {
                className = "";
                strSpan += "<a id=\"" + temp + "\">" + temp + "</a>";
            }
            else {
                className = "class=\"current\"";
                strSpan += "<span id=\"" + temp + "\" " + className + ">" + temp + "</span>";
            }
            temp++;
            bBool = true;
        }
    }

    var sNext = "<a id=\"next\">&lt;&lt; Next </a>";
    if (flag == 2) {
        sNext = "<span id=\"next\" class=\"disabled\">&lt;&lt; Prev</span>";
    }
    strSpan += sNext;
    if (bBool)
        $('#pagination').append(strSpan);
}

function getObjById(id) {
    if (document.getElementById)
        var returnVar = document.getElementById(id);
    else if (document.all)
        var returnVar = document.all[id];
    else if (document.layers)
        var returnVar = document.layers[id];
    return returnVar;
}

//// su dung cho cac truong co khoa ngoai,combobox

Constants.GetKhachHang = function (id, value) {
    var serviceUrl = Constants.service + "getAllTblKhachHangs";
    $.ajax({
        type: "Post",
        url: serviceUrl, // Location of the service
        //data: json, //Data sent to server
        contentType: "application/json", // content type sent to server
        dataType: "json", //Expected data format from server
        cache: false,
        success: function (msg) {
            var results = msg.getAllTblKhachHangsResult;
            var cbbMa = document.getElementById(id);
            $("#" + id).find('option').remove();
            for (var i = 0; i < results.length; i++) {
                var name = results[i].TenKhachHang;
                var ma = results[i].MaKhachHang;
                var optionNode = document.createElement("option");
                optionNode.setAttribute("value", ma);
                optionNode.text = name;
                cbbMa.appendChild(optionNode);
            }
            if (value != undefined && value != -1) { 
                
            }
        },
        error: function (err) {
            // When Service call fails
        }
    });
}

Constants.GetDonVi = function (id) {
    var serviceUrl = Constants.service + "getAllTblDonVis";
    $.ajax({
        type: "Post",
        url: serviceUrl, // Location of the service
        //data: json, //Data sent to server
        contentType: "application/json", // content type sent to server
        dataType: "json", //Expected data format from server
        cache: false,
        success: function (msg) {
            var results = msg.getAllTblDonVisResult;
            var cbbMa = document.getElementById(id);
            $("#" + id).find('option').remove();
            for (var i = 0; i < results.length; i++) {
                var name = results[i].TenDonVi;
                var ma = results[i].MaDonVi;
                var optionNode = document.createElement("option");
                optionNode.setAttribute("value", ma);
                optionNode.text = name;
                cbbMa.appendChild(optionNode);
            }
        },
        error: function (err) {
            // When Service call fails
        }
    });
}

Constants.GetNhomNguoiDung = function (id) {
    var serviceUrl = Constants.service + "getAllTblNhomNguoiDungs";
    $.ajax({
        type: "Post",
        url: serviceUrl, // Location of the service
        //data: json, //Data sent to server
        contentType: "application/json", // content type sent to server
        dataType: "json", //Expected data format from server
        cache: false,
        success: function (msg) {
            var results = msg.getAllTblNhomNguoiDungsResult;
            var cbbMa = document.getElementById(id);
            $("#" + id).find('option').remove();
            for (var i = 0; i < results.length; i++) {
                var name = results[i].TenNhom;
                var ma = results[i].MaNhom;
                var optionNode = document.createElement("option");
                optionNode.setAttribute("value", ma);
                optionNode.text = name;
                cbbMa.appendChild(optionNode);
            }
        },
        error: function (err) {
            // When Service call fails
        }
    });
}

Constants.GetLoaiBpbk = function (id) {
    var serviceUrl = Constants.service + "getAllTblLoaiBpbks";
    $.ajax({
        type: "Post",
        url: serviceUrl, // Location of the service
        //data: json, //Data sent to server
        contentType: "application/json", // content type sent to server
        dataType: "json", //Expected data format from server
        cache: false,
        success: function (msg) {
            var results = msg.getAllTblLoaiBpbksResult;
            var cbbMa = document.getElementById(id);
            $("#" + id).find('option').remove();
            for (var i = 0; i < results.length; i++) {
                var name = results[i].TenLoaiBpbk;
                var ma = results[i].MaLoaiBpbk;
                var optionNode = document.createElement("option");
                optionNode.setAttribute("value", ma);
                optionNode.text = name;
                cbbMa.appendChild(optionNode);
            }
        },
        error: function (err) {
            // When Service call fails
        }
    });
}

Constants.GetTuyenPhat = function (id) {
    var serviceUrl = Constants.service + "getAllTblTuyenPhats";
    $.ajax({
        type: "Post",
        url: serviceUrl, // Location of the service
        //data: json, //Data sent to server
        contentType: "application/json", // content type sent to server
        dataType: "json", //Expected data format from server
        cache: false,
        success: function (msg) {
            var results = msg.getAllTblTuyenPhatsResult;
            var cbbMa = document.getElementById(id);
            $("#" + id).find('option').remove();
            for (var i = 0; i < results.length; i++) {
                var name = results[i].TenTuyenPhat;
                var ma = results[i].MaTuyenPhat;
                var optionNode = document.createElement("option");
                optionNode.setAttribute("value", ma);
                optionNode.text = name;
                cbbMa.appendChild(optionNode);
            }
        },
        error: function (err) {
            // When Service call fails
        }
    });
}


Constants.GetTrangThai = function (id) {
    var serviceUrl = Constants.service + "getAllTblTrangThaiBills";
    $.ajax({
        type: "Post",
        url: serviceUrl, // Location of the service
        // data: json, //Data sent to server
        contentType: "application/json", // content type sent to server
        dataType: "json", //Expected data format from server
        cache: false,
        success: function (msg) {
            var results = msg.getAllTblTrangThaiBillsResult;
            var cbbMa = document.getElementById(id);
            $("#"+id).find('option').remove();
            for (var i = 0; i < results.length; i++) {
                var name = results[i].TenTrangThai;
                var ma = results[i].MaTrangThai;
                var optionNode = document.createElement("option");
                optionNode.setAttribute("value", ma);
                optionNode.text = name;
                cbbMa.appendChild(optionNode);
            }
        },
        error: function (err) {
            // When Service call fails
        }
    });
}
Constants.KeyPressEndter = function (fields) {
    for (var i = 0; i < fields.length - 1; i++) {
        var strField1 = "#" + String(fields[i]).trim();
        var strField2 = "#" + String(fields[i + 1]).trim();
        $(strField1).keypress(function (event) {
            if (event.keyCode == 13) {
                $(strField2).focus();
                event.preventDefault();
            }
        });

    }
}

var MD5 = function (string) {

    function RotateLeft(lValue, iShiftBits) {
        return (lValue << iShiftBits) | (lValue >>> (32 - iShiftBits));
    }

    function AddUnsigned(lX, lY) {
        var lX4, lY4, lX8, lY8, lResult;
        lX8 = (lX & 0x80000000);
        lY8 = (lY & 0x80000000);
        lX4 = (lX & 0x40000000);
        lY4 = (lY & 0x40000000);
        lResult = (lX & 0x3FFFFFFF) + (lY & 0x3FFFFFFF);
        if (lX4 & lY4) {
            return (lResult ^ 0x80000000 ^ lX8 ^ lY8);
        }
        if (lX4 | lY4) {
            if (lResult & 0x40000000) {
                return (lResult ^ 0xC0000000 ^ lX8 ^ lY8);
            } else {
                return (lResult ^ 0x40000000 ^ lX8 ^ lY8);
            }
        } else {
            return (lResult ^ lX8 ^ lY8);
        }
    }

    function F(x, y, z) {
        return (x & y) | ((~x) & z);
    }

    function G(x, y, z) {
        return (x & z) | (y & (~z));
    }

    function H(x, y, z) {
        return (x ^ y ^ z);
    }

    function I(x, y, z) {
        return (y ^ (x | (~z)));
    }

    function FF(a, b, c, d, x, s, ac) {
        a = AddUnsigned(a, AddUnsigned(AddUnsigned(F(b, c, d), x), ac));
        return AddUnsigned(RotateLeft(a, s), b);
    }
    ;

    function GG(a, b, c, d, x, s, ac) {
        a = AddUnsigned(a, AddUnsigned(AddUnsigned(G(b, c, d), x), ac));
        return AddUnsigned(RotateLeft(a, s), b);
    }
    ;

    function HH(a, b, c, d, x, s, ac) {
        a = AddUnsigned(a, AddUnsigned(AddUnsigned(H(b, c, d), x), ac));
        return AddUnsigned(RotateLeft(a, s), b);
    }
    ;

    function II(a, b, c, d, x, s, ac) {
        a = AddUnsigned(a, AddUnsigned(AddUnsigned(I(b, c, d), x), ac));
        return AddUnsigned(RotateLeft(a, s), b);
    }
    ;

    function ConvertToWordArray(string) {
        var lWordCount;
        var lMessageLength = string.length;
        var lNumberOfWords_temp1 = lMessageLength + 8;
        var lNumberOfWords_temp2 = (lNumberOfWords_temp1 - (lNumberOfWords_temp1 % 64)) / 64;
        var lNumberOfWords = (lNumberOfWords_temp2 + 1) * 16;
        var lWordArray = Array(lNumberOfWords - 1);
        var lBytePosition = 0;
        var lByteCount = 0;
        while (lByteCount < lMessageLength) {
            lWordCount = (lByteCount - (lByteCount % 4)) / 4;
            lBytePosition = (lByteCount % 4) * 8;
            lWordArray[lWordCount] = (lWordArray[lWordCount] | (string
					.charCodeAt(lByteCount) << lBytePosition));
            lByteCount++;
        }
        lWordCount = (lByteCount - (lByteCount % 4)) / 4;
        lBytePosition = (lByteCount % 4) * 8;
        lWordArray[lWordCount] = lWordArray[lWordCount]
				| (0x80 << lBytePosition);
        lWordArray[lNumberOfWords - 2] = lMessageLength << 3;
        lWordArray[lNumberOfWords - 1] = lMessageLength >>> 29;
        return lWordArray;
    }
    ;

    function WordToHex(lValue) {
        var WordToHexValue = "", WordToHexValue_temp = "", lByte, lCount;
        for (lCount = 0; lCount <= 3; lCount++) {
            lByte = (lValue >>> (lCount * 8)) & 255;
            WordToHexValue_temp = "0" + lByte.toString(16);
            WordToHexValue = WordToHexValue
					+ WordToHexValue_temp.substr(
							WordToHexValue_temp.length - 2, 2);
        }
        return WordToHexValue;
    }
    ;

    function Utf8Encode(string) {
        string = string.replace(/rn/g, "n");
        var utftext = "";

        for (var n = 0; n < string.length; n++) {
            var c = string.charCodeAt(n);
            if (c < 128) {
                utftext += String.fromCharCode(c);
            } else if ((c > 127) && (c < 2048)) {
                utftext += String.fromCharCode((c >> 6) | 192);
                utftext += String.fromCharCode((c & 63) | 128);
            } else {
                utftext += String.fromCharCode((c >> 12) | 224);
                utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                utftext += String.fromCharCode((c & 63) | 128);
            }
        }
        return utftext;
    }
    ;

    var x = Array();
    var k, AA, BB, CC, DD, a, b, c, d;
    var S11 = 7, S12 = 12, S13 = 17, S14 = 22;
    var S21 = 5, S22 = 9, S23 = 14, S24 = 20;
    var S31 = 4, S32 = 11, S33 = 16, S34 = 23;
    var S41 = 6, S42 = 10, S43 = 15, S44 = 21;

    string = Utf8Encode(string);

    x = ConvertToWordArray(string);

    a = 0x67452301;
    b = 0xEFCDAB89;
    c = 0x98BADCFE;
    d = 0x10325476;

    for (k = 0; k < x.length; k += 16) {
        AA = a;
        BB = b;
        CC = c;
        DD = d;
        a = FF(a, b, c, d, x[k + 0], S11, 0xD76AA478);
        d = FF(d, a, b, c, x[k + 1], S12, 0xE8C7B756);
        c = FF(c, d, a, b, x[k + 2], S13, 0x242070DB);
        b = FF(b, c, d, a, x[k + 3], S14, 0xC1BDCEEE);
        a = FF(a, b, c, d, x[k + 4], S11, 0xF57C0FAF);
        d = FF(d, a, b, c, x[k + 5], S12, 0x4787C62A);
        c = FF(c, d, a, b, x[k + 6], S13, 0xA8304613);
        b = FF(b, c, d, a, x[k + 7], S14, 0xFD469501);
        a = FF(a, b, c, d, x[k + 8], S11, 0x698098D8);
        d = FF(d, a, b, c, x[k + 9], S12, 0x8B44F7AF);
        c = FF(c, d, a, b, x[k + 10], S13, 0xFFFF5BB1);
        b = FF(b, c, d, a, x[k + 11], S14, 0x895CD7BE);
        a = FF(a, b, c, d, x[k + 12], S11, 0x6B901122);
        d = FF(d, a, b, c, x[k + 13], S12, 0xFD987193);
        c = FF(c, d, a, b, x[k + 14], S13, 0xA679438E);
        b = FF(b, c, d, a, x[k + 15], S14, 0x49B40821);
        a = GG(a, b, c, d, x[k + 1], S21, 0xF61E2562);
        d = GG(d, a, b, c, x[k + 6], S22, 0xC040B340);
        c = GG(c, d, a, b, x[k + 11], S23, 0x265E5A51);
        b = GG(b, c, d, a, x[k + 0], S24, 0xE9B6C7AA);
        a = GG(a, b, c, d, x[k + 5], S21, 0xD62F105D);
        d = GG(d, a, b, c, x[k + 10], S22, 0x2441453);
        c = GG(c, d, a, b, x[k + 15], S23, 0xD8A1E681);
        b = GG(b, c, d, a, x[k + 4], S24, 0xE7D3FBC8);
        a = GG(a, b, c, d, x[k + 9], S21, 0x21E1CDE6);
        d = GG(d, a, b, c, x[k + 14], S22, 0xC33707D6);
        c = GG(c, d, a, b, x[k + 3], S23, 0xF4D50D87);
        b = GG(b, c, d, a, x[k + 8], S24, 0x455A14ED);
        a = GG(a, b, c, d, x[k + 13], S21, 0xA9E3E905);
        d = GG(d, a, b, c, x[k + 2], S22, 0xFCEFA3F8);
        c = GG(c, d, a, b, x[k + 7], S23, 0x676F02D9);
        b = GG(b, c, d, a, x[k + 12], S24, 0x8D2A4C8A);
        a = HH(a, b, c, d, x[k + 5], S31, 0xFFFA3942);
        d = HH(d, a, b, c, x[k + 8], S32, 0x8771F681);
        c = HH(c, d, a, b, x[k + 11], S33, 0x6D9D6122);
        b = HH(b, c, d, a, x[k + 14], S34, 0xFDE5380C);
        a = HH(a, b, c, d, x[k + 1], S31, 0xA4BEEA44);
        d = HH(d, a, b, c, x[k + 4], S32, 0x4BDECFA9);
        c = HH(c, d, a, b, x[k + 7], S33, 0xF6BB4B60);
        b = HH(b, c, d, a, x[k + 10], S34, 0xBEBFBC70);
        a = HH(a, b, c, d, x[k + 13], S31, 0x289B7EC6);
        d = HH(d, a, b, c, x[k + 0], S32, 0xEAA127FA);
        c = HH(c, d, a, b, x[k + 3], S33, 0xD4EF3085);
        b = HH(b, c, d, a, x[k + 6], S34, 0x4881D05);
        a = HH(a, b, c, d, x[k + 9], S31, 0xD9D4D039);
        d = HH(d, a, b, c, x[k + 12], S32, 0xE6DB99E5);
        c = HH(c, d, a, b, x[k + 15], S33, 0x1FA27CF8);
        b = HH(b, c, d, a, x[k + 2], S34, 0xC4AC5665);
        a = II(a, b, c, d, x[k + 0], S41, 0xF4292244);
        d = II(d, a, b, c, x[k + 7], S42, 0x432AFF97);
        c = II(c, d, a, b, x[k + 14], S43, 0xAB9423A7);
        b = II(b, c, d, a, x[k + 5], S44, 0xFC93A039);
        a = II(a, b, c, d, x[k + 12], S41, 0x655B59C3);
        d = II(d, a, b, c, x[k + 3], S42, 0x8F0CCC92);
        c = II(c, d, a, b, x[k + 10], S43, 0xFFEFF47D);
        b = II(b, c, d, a, x[k + 1], S44, 0x85845DD1);
        a = II(a, b, c, d, x[k + 8], S41, 0x6FA87E4F);
        d = II(d, a, b, c, x[k + 15], S42, 0xFE2CE6E0);
        c = II(c, d, a, b, x[k + 6], S43, 0xA3014314);
        b = II(b, c, d, a, x[k + 13], S44, 0x4E0811A1);
        a = II(a, b, c, d, x[k + 4], S41, 0xF7537E82);
        d = II(d, a, b, c, x[k + 11], S42, 0xBD3AF235);
        c = II(c, d, a, b, x[k + 2], S43, 0x2AD7D2BB);
        b = II(b, c, d, a, x[k + 9], S44, 0xEB86D391);
        a = AddUnsigned(a, AA);
        b = AddUnsigned(b, BB);
        c = AddUnsigned(c, CC);
        d = AddUnsigned(d, DD);
    }
    var temp = WordToHex(a) + WordToHex(b) + WordToHex(c) + WordToHex(d);
    return temp.toLowerCase();
}